// Modules to control application life and create native browser window
const { app, BrowserWindow, ipcMain, net } = require('electron');
const axios = require('axios');
const path = require('node:path');
const fs = require('fs');
const initSqlJs = require('./static/js/sql-wasm.js');

function createWindow () {
    // Create the browser window.
    const mainWindow = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
            preload: path.join(__dirname, 'preload.js')
        }
    })
    
    // and load the index.html of the app.
    mainWindow.loadFile('index.html')

    // Open the DevTools.
    mainWindow.webContents.openDevTools()
  
    ipcMain.on('fetch-data', (event, args) => {
        let url = "https://jsonplaceholder.typicode.com/todos/1";
        axios({
            method: "get",
            url: url,
            /*
            proxy: {
                protocol: "http",
                host: "localhost",
                port: 8180
            }
            */
        }).then(response => {
            console.log(response.data);
            event.reply('fetch-data-response', response.data);
        }).catch(error =>{
            console.log(error)
        });
      
        // using net module
        /*
        const request = net.request(url);
        request.on("response", response => {
            let json = "";
            response.on("data", data =>(json += data));
            response.on("end", () => {
                event.reply("fetch-data-response", json);
            });
        });
        */
    });
    // post example
    /*
    ipcMain.on('fetch-data', (event, args) => {
        let json_data = args;
        
        let url = "XXXXXXX";
        
        const request = net.request({
            method: "POST",
            headers: {
               "Content-type": "application/json" 
            },
            url: url
        });
        request.on("response", response => {
            let json = "";
            response.on("data", data =>(json += data));
            response.on("end", () => {
                event.reply("fetch-data-response", json);
            });
            request.write(JSON.stringify(json_data));
            request.end();
        });
    });
    */
    // get db
    ipcMain.on('get-db', (event, args) => {
        
        var filebuffer = fs.readFileSync('test.sqlite');
        var config = {
            locateFile: filename => `./static/js/${filename}`
        };
        var json_data = ""
        initSqlJs(config).then(SQL => {
            var db = new SQL.Database(filebuffer);
            var res = db.exec("select * from user");
            json_data = JSON.stringify(res);
            //console.log(json_data);
            event.reply("get-db-response", json_data);
        });
    });
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(() => {
  createWindow()

  app.on('activate', function () {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
